#ifndef __BSP_KEY_H
#define __BSP_KEY_H

#include "ch32f10x.h"
	

/* 按键口对应的RCC时钟 */
#define RCC_ALL_KEY 		 RCC_APB2Periph_GPIOA
#define GPIO_PORT_KEY    GPIOA

#define GPIO_PIN_K1	     GPIO_Pin_0

/*
	按键滤波时间50ms, 单位50ms。
	只有连续检测到50ms状态不变才认为有效，包括弹起和按下两种事件
	即使按键电路不做硬件滤波，该滤波机制也可以保证可靠地检测到按键事件
*/
#define KEY_FILTER_TIME   1
#define KEY_LONG_TIME     50			/* 单位30ms， 持续1秒，认为长按事件 */
#define KEY_DOWN_LEVEL    0     // 按键按下的电平值  1：高电平  0：低电平

/*
	定义键值代码, 必须按如下次序定义每个键的按下、弹起和长按事件

	推荐使用enum, 不用#define，原因：
	(1) 便于新增键值,方便调整顺序，使代码看起来舒服点
	(2) 编译器可帮我们避免键值重复。
*/
typedef enum
{
	KEY_NONE = 0,		/* 0 表示无按键事件 */

	KEY_DOWN,				/* 1按下 */
	KEY_UP,					/* 2弹起 */
	KEY_LONG,				/* 3长按 */
	KEY_SHORT,			/* 4短按 */
}KEY_ENUM;
/*
	每个按键对应1个全局的结构体变量。
*/
typedef struct
{
	/* 下面是一个函数指针，指向判断按键手否按下的函数 */
	uint8_t (*IsKeyDownFunc)(void); /* 按键按下的判断函数,1表示按下 */

	uint16_t LongCount;		/* 长按计数器 */
	uint8_t  State;				/* 按键当前状态（按下还是弹起） */
}KEY_T;

extern KEY_T key;

void KEY_Init(void);
void KEY_Scan(void);
KEY_ENUM KEY_GetState(void);
#endif
